﻿using IQReportes.Models;
using IQReportes.Models.Logica;
using IQReportes.Utils;
using System;
using System.Collections.Generic;
using System.Globalization;
using System.Linq;
using System.Web;

namespace IQReportes.ViewModels
{
    /// <summary>
    /// Clase de parámetros para la consulta de los módulos del panel de control
    /// </summary>
    public class QueryPCViewModel
    {
        /// <summary>
        /// fecha inicial
        /// </summary>
        public string fechaInicial;
        /// <summary>
        /// desde
        /// </summary>
        public DateTime desde;
        /// <summary>
        /// número de módulo
        /// </summary>
        public int modulo;
        /// <summary>
        /// tipo chart
        /// </summary>
        public int tipoChart;
        /// <summary>
        /// institución seleccionada
        /// </summary>
        public int institucion;
        /// <summary>
        /// nivel del tree
        /// </summary>
        public int nivel;
        /// <summary>
        /// nivel de nodo hijo del tree
        /// </summary>
        public string nivelTreeHijo;
        /// <summary>
        /// nivel de nodo padre del tree
        /// </summary>
        public string nivelTreePadre;
        /// <summary>
        /// código de nodo hijo del tree
        /// </summary>
        public string codHijo;
        /// <summary>
        /// código de nodo padre del tree
        /// </summary>
        public string codPadre;
        /// <summary>
        /// motivo de no operación seleccionado
        /// </summary>
        public string motivoNoOperativo;
        /// <summary>
        /// tiempo sin transaccionar seleccionado
        /// </summary>
        public string tiempoSinTx;
        /// <summary>
        /// id de motivo de no operación
        /// </summary>
        public int? idMotivoNoOperativo;
        /// <summary>
        /// id de tiempo sin transaccionar seleccionado
        /// </summary>
        public int? idTiempoSinTx;
        /// <summary>
        /// código relacionado a tabla tiempo
        /// </summary>
        public int codTablaTiempo;

        /// <summary>
        /// constructor con parámetros
        /// </summary>
        /// <param name="fechaInicial">fecha inicial</param>
        /// <param name="modulo">módulo</param>
        /// <param name="tipoChart">tipo chart</param>
        /// <param name="institucion">institución</param>
        /// <param name="nivelTreeHijo">nivel tree hijo</param>
        /// <param name="nivelTreePadre">nivel tree padre</param>
        /// <param name="codHijo">código nodo hijo</param>
        /// <param name="codPadre">código nodo padre</param>
        /// <param name="motivoNoOperativo">código de no operación</param>
        /// <param name="tiempoSinTx">tiempo sin transaccionar</param>
        /// <param name="nivel">nivel</param>
        public QueryPCViewModel(string fechaInicial, int modulo, int tipoChart, int institucion,string nivelTreeHijo,
                            string nivelTreePadre, string codHijo,string codPadre,string motivoNoOperativo, string tiempoSinTx, int nivel)
        {
            DiasAntiguedadDAO  dbDias = new DiasAntiguedadDAO();
            MotivoInoperativoDIRDAO dbMotivo = new MotivoInoperativoDIRDAO();
            this.nivel = nivel;
            this.modulo = modulo;
            this.tipoChart = tipoChart;
            this.institucion = institucion;
            this.nivelTreeHijo = null;
            if (nivelTreeHijo != null && !("NULL").Equals(nivelTreeHijo.ToUpper()) && nivelTreeHijo != "")
            {
                this.nivelTreeHijo = nivelTreeHijo;
            }
            this.nivelTreePadre = null;
            if (nivelTreePadre != null && !("NULL").Equals(nivelTreePadre.ToUpper()) && nivelTreePadre != "")
            {
                this.nivelTreePadre = nivelTreePadre;
            }
            this.motivoNoOperativo = null;
            if (motivoNoOperativo != null && !("NULL").Equals(motivoNoOperativo.ToUpper()) && motivoNoOperativo!="")
            {
                this.motivoNoOperativo = motivoNoOperativo;
                this.idMotivoNoOperativo = dbMotivo.motivosInoperativos.Where(x => x.vcMotivo.CompareTo(motivoNoOperativo) == 0).First().idMotivo;
            }
            this.tiempoSinTx = null;
            if (tiempoSinTx != null && !("NULL").Equals(tiempoSinTx.ToUpper()) && tiempoSinTx!="")
            {
                this.tiempoSinTx = tiempoSinTx;
                this.idTiempoSinTx = dbDias.diasAntiguedad.Where(x => x.vcNombre.CompareTo(tiempoSinTx)==0).First().idDiasAntiguedad;
            }
            this.codHijo = null;
            if (codHijo != null && !("NULL").Equals(codHijo.ToUpper()) && codHijo != "")
            {
                this.codHijo = codHijo;
            }
            this.codPadre = null;
            if (codPadre != null && !("NULL").Equals(codPadre.ToUpper()) && codPadre != "")
            {
                this.codPadre = codPadre;
            }
            this.fechaInicial = fechaInicial;
            this.desde = DateTime.ParseExact(fechaInicial, "dd/MM/yyyy", CultureInfo.InvariantCulture);
            this.codTablaTiempo = -1;
            DateTime hasta = (new LogicaParametro()).getFechaFinalPC();
            TimeSpan diferenciaDias = hasta - desde;
            int dias = diferenciaDias.Days;
            if ( dias<=6) {
                this.codTablaTiempo = Constantes.CODIGO_DIA;
            }
            else if(dias <= 42){
                this.codTablaTiempo = Constantes.CODIGO_SEMANA;
            }
            else if (dias <= 365)
            {
                this.codTablaTiempo = Constantes.CODIGO_MES;
            }
            else
            {
                this.codTablaTiempo = Constantes.CODIGO_ANO;
            }
        }
    }
}